package com.scanner;

import java.lang.reflect.Method;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

import com.annotation.SocketCmd;
import com.annotation.SocketModule;

/**
 * 如果我们需要在Spring容器完成Bean的实例化、配置和其他的初始化前后添加一些自己的逻辑处理，
 * 我们就可以定义一个或者多个BeanPostProcessor接口的实现，然后注册到容器中。
 * 
 * @author bearomac
 */

@Component
public class Scanner implements BeanPostProcessor {

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
		Class<?> clazz = bean.getClass();
//		Class<?>[] interfaces = clazz.getInterfaces();
		
//		if(interfaces != null && interfaces.length > 0){
//			for(Class<?> interf : interfaces){
				
				SocketModule socketModule = clazz.getAnnotation(SocketModule.class);
				if(socketModule == null){
					return bean;
				}
				
				Method[] methods = clazz.getMethods();
				if(methods != null && methods.length > 0){
					
					for(Method method : methods){
						SocketCmd socketCmd = method.getAnnotation(SocketCmd.class);
						if(socketCmd == null){
							continue;
						}
						
						String module = socketModule.module();
						String cmd = socketCmd.cmd();
						
						Invoker invoker = Invoker.initInVoker(bean, method);
						
						if(InvokerHolder.getInvoker(module, cmd) == null){
							InvokerHolder.addInvoker(module, cmd, invoker);
						}else{
							System.err.println("重复注册invoker执行器");
						}
						
					}
				}
				
//			}
//		}
		
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {
		
		return bean;
	}

}
